home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / kowin / archive / sys / koadd.lzh / patch / _ma_new.c next >
C/C++ Source or Header  |  1994-11-29  |  3KB  |  133 lines

  1. /*
  2.  * PROJECT C Library, X68000 PROGRAMMING INTERFACE DEFINITION
  3.  * --------------------------------------------------------------------
  4.  * This file is written by the Project C Library Group,  and completely
  5.  * in public domain. You can freely use, copy, modify, and redistribute
  6.  * the whole contents, without this notice.
  7.  * --------------------------------------------------------------------
  8.  * $Id: _ma_new.c,v 1.3 1994/07/27 13:49:53 mura Exp $
  9.  */
  10.  
  11. /* System headers */
  12. #include <stdlib.h>
  13. #include <limits.h>
  14. #include <sys/xstart.h>
  15. #include <sys/xstdlib.h>
  16.  
  17. #ifdef __LIBSXC__
  18.  
  19. /* External variables */
  20. int _ma_fnum;
  21. char *_ma_flist;
  22. char *_ma_lptr = 0;
  23. extern size_t _SX_GETMEM_SIZE;
  24.  
  25. #else
  26.  
  27. /* External variables */
  28. int _ma_fnum;
  29. char *_ma_flist;
  30. char *_ma_lptr;
  31.  
  32. #endif
  33.  
  34. /* Functions */
  35. #ifdef __LIBSXC__
  36. static __inline void *_SX_GET_PTR (size_t size)
  37. {
  38.     register void *reg_d0 asm ("d0");
  39.  
  40.     /* インラインアセンブラ展開 */
  41.     asm volatile ("move.l %1,-(sp)\n\t"
  42.           "dc.w $a01e\n\t"
  43.           "addq.w #4,sp"
  44.           : "=r" (reg_d0)
  45.           : "g" (size)
  46.           : "a0");
  47.  
  48.     /* 結果を返す */
  49.     return reg_d0;
  50. }
  51. #endif
  52.  
  53. /* Functions */
  54. char *_ma_new (size_t size)
  55. {
  56. #ifdef __LIBSXC__
  57.  
  58.     char *alloc;
  59.     size_t newsize = _SX_GETMEM_SIZE;
  60.  
  61.     /* 要求サイズが既定値より大きかったら要求サイズを確保 */
  62.     if (size > _SX_GETMEM_SIZE)
  63.     newsize = size;
  64.  
  65.     /* 新しいヒープブロックを確保 */
  66.     if ((alloc = _SX_GET_PTR (newsize + 12)) == 0)
  67.     return 0;
  68.  
  69.     /* ひとつ前のヒープブロックを覚えておく */
  70.     *(long *) alloc = (long) _ma_lptr;
  71.     _ma_lptr = alloc;
  72.  
  73.     /* 終端識別子を書き込む */
  74.     alloc += 8;
  75.     MA_BFLAG (alloc) = MA_VALUE (MA_EXIT, 0);
  76.     MA_FFLAG (alloc + newsize) = MA_VALUE (MA_EXIT, 0xffffff);
  77.  
  78.     /* 全体を空きブロックリストに登録 */
  79.     MA_FFLAG (alloc) = MA_VALUE (MA_FREE, newsize);
  80.     MA_BFLAG (alloc + newsize) = MA_VALUE (MA_FREE, newsize);
  81.     _ma_add (alloc);
  82.  
  83.     /* その後リサイクル */
  84.     alloc = _ma_recycle (alloc, &size);
  85.  
  86. #else
  87.  
  88.     long more;                /* より必要なヒープの量 */
  89.     char *alloc;            /* 新しい割り当てアドレス */
  90.  
  91.     /*
  92.     ** メモリブロック列の最後のアドレスを得る。ブロック列の最後が
  93.     ** 登録されていないようなら、_hsta + 4 を値として登録する。ま
  94.     ** た、_hsta から先頭識別子 4 バイトを書き込む。
  95.     */
  96.     if ((alloc = _ma_lptr) == 0) {
  97.     alloc = _hsta + 4;
  98.     MA_BFLAG (alloc) = MA_VALUE (MA_EXIT, 0);
  99.     }
  100.  
  101.     /*
  102.     ** ブロック列の最後のアドレスから size バイト分をヒープ領域内
  103.     ** に確保するとした場合に足りない分のバイト数を計算する。
  104.     */
  105.     more = alloc + size + 4 - (char *) _last;
  106.  
  107.     /*
  108.     ** もし足りない量が正ならば領域を拡大する。その際、ブレーク値
  109.     ** はページサイズ(4K)バンダリで拡張される。ただし最後の終端情
  110.     ** 報の 4 バイト分を含む。拡張に失敗した場合はエラーリターン。
  111.     */
  112.     if (more > 0) {
  113. #if 0 /* KOWIN */
  114.     if ((int) sbrk (more) < 0)
  115. #endif
  116.         return 0;
  117.     }
  118.  
  119.     /*
  120.     ** 新たに算出したメモリブロックをメモリブロック終端とし、その
  121.     ** すぐ後ろに終端識別子を埋め込む。
  122.     */
  123.     _ma_lptr = alloc + size;
  124.     MA_FFLAG (_ma_lptr) = MA_VALUE (MA_EXIT, 0xffffff);
  125.  
  126. #endif
  127.  
  128.     /*
  129.     ** アドレスを返す。
  130.     */
  131.     return alloc;
  132. }
  133.